// 枚举
// rust中可以直接将数据附加到枚举的变体中
// 优点是不需要额外使用struct，每个变体可拥有不同的类型以及关联的数据量
// null在其他语言中表示没有值，在rust中类似null的概念Option<T>它的枚举值有两种一种是Some(T)一种是None

// 控制流运算符match（有点类似ts的枚举赋值）
// 允许一个值与一个系列模式进行匹配，兵执行匹配的模式对应的代码
// 模式可以是字面值，变量名，通配符...
// 匹配的分支可以绑定到被匹配对象的部分值，因此可以从enum变体中提取值
// 必需要穷举所有的可能性，其中通配符_可以替代其余的所有可能性
// if let else 只关心一种匹配,代码更少，更少的模板代码，放弃了穷举的可能性
// 可以吧if let else 看成match的语法糖

// enum Option<T> {
//     Some(T),
//     None
// }

#[derive(Debug)]
enum IP {
    V4(String),
    V6,
}

enum test {
    object {a:String, b: String},
    quit,
    string(String),
    yuan(String,String,String)
}

#[derive(Debug)]
enum Country {
    china,
    USA
}
enum Coin {
    rmb(Country),
    penny,
    dime
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::rmb(country) => {
            println!("$535345,{:#?}", country);
            return 23;
        },
        Coin::penny => 55,
        _ => 0,
    }
}

#[derive(Debug)]
struct IPList {
    kind:IP,
    name:String
}

fn main() {
    let some_number = Some(5);
    let some_string = Some("AAA");
    let absent_number: Option<i32> = None;
    let a = IP::V4(String::from("value"));
    let ab = IPList {
        kind: IP::V4(String::from("test")),
        name: String::from("IPV4")
    };
    let c = Coin::rmb(Country::USA);
    println!("{:#?}{:#?},{:?}", ab, a, value_in_cents(c));
    println!("hello world");

    let v = Some(0u8);
    match v {
        Some(3) => println!("234"),
        _ => println!("123"),
    }
    // 效果同上
    if let Some(3) = v {
        println!("234");
    } else {
        println!("123")
    }
}
